package com.novasec;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.apache.commons.beanutils.BeanMap;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.novatec.mvc.modelo.CajasItem;

public class NuevoLoginClienteDAO {
	private final Logger logger = Logger.getLogger(this.getClass());
	private SimpleJdbcTemplate simpleJdbcTemplate;
//	private SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyy");

	@Autowired
    public void init(DataSource dataSource) {
        this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource);
    }

	@SuppressWarnings({ "unchecked", "rawtypes" })
	@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
	public void insertarNuevoLoginCliente(NuevoLoginClienteItem nuevoLoginClienteItem) throws ParseException {
		
		String sqlInsertUserSec = "insert into novasec.users " +
		"(username,password,enabled) " +
		"values (:login,:password,1)";
		
		logger.debug("insert into novasec.users (username,password,enabled) values (" + nuevoLoginClienteItem.getLogin() + ","+ nuevoLoginClienteItem.getPassword()+",1);") ;
		
		String sqlInsertAuthorities = "insert into novasec.authorities " +
		"(username,authority) "  +
		"values (:login,'ROLE_CLIENT')";
		
		String sqlUpdateIdentificadores = "update novatec.identificadores set id=id+1 where name='CLIENTE'";
		
		String sqlInsertUsuario = "insert into novatec.usuario (IdUsuario,IndActivo,Login,Clave) " +
		"select id,'1',:login,:password " +
	    "from novatec.identificadores " +
	    "where name='CLIENTE'";
		
		String sqlInsertCliente = "insert into novatec.cliente (IdUsuario,TipoPersona,RUC_DNI,RazonSocialNombre,Direccion) " + 
			"select id,:tipopersona,:rucdni,:nombrerazonsocial,'-' " +
		    "from novatec.identificadores " +
		    "where name='CLIENTE'";
		    
		Map nLogin1Map= new BeanMap(nuevoLoginClienteItem);
		Map nLogin2Map= new BeanMap(nuevoLoginClienteItem);
		Map nLogin3Map= new BeanMap(nuevoLoginClienteItem);
		Map nLogin4Map= new BeanMap(nuevoLoginClienteItem);
		Map nLogin5Map= new BeanMap(nuevoLoginClienteItem);
		
		MapSqlParameterSource mapSQL1= new MapSqlParameterSource(nLogin1Map);
		MapSqlParameterSource mapSQL2= new MapSqlParameterSource(nLogin2Map);
		MapSqlParameterSource mapSQL3= new MapSqlParameterSource(nLogin3Map);
		MapSqlParameterSource mapSQL4= new MapSqlParameterSource(nLogin4Map);
		MapSqlParameterSource mapSQL5= new MapSqlParameterSource(nLogin5Map);
		
		simpleJdbcTemplate.update(sqlInsertUserSec, mapSQL1);
		simpleJdbcTemplate.update(sqlInsertAuthorities, mapSQL2);
		simpleJdbcTemplate.update(sqlUpdateIdentificadores, mapSQL3);
		simpleJdbcTemplate.update(sqlInsertUsuario, mapSQL4);
		simpleJdbcTemplate.update(sqlInsertCliente, mapSQL5);
		
		
		//sqlInsertAuthorities
		
	
		logger.debug("cliente nuevo y su login insertados");
		
		
	}
	// valida el campo login
	@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
	public List<NuevoLoginClienteItem> validarLoginCliente(NuevoLoginClienteItem nuevoLoginClienteItem) throws ParseException {
		
		RowMapper<NuevoLoginClienteItem> mapper = new RowMapper<NuevoLoginClienteItem>() {  
	        public NuevoLoginClienteItem mapRow(ResultSet rs, int rowNum) throws SQLException {
	        	NuevoLoginClienteItem item = new NuevoLoginClienteItem();	        	
	        	String loginCliente = rs.getString("login");
	        	item.setLogin(loginCliente);
	            return item;
	        }
	    };		
		String sql="select login from novatec.usuario where login=?";		
		List<NuevoLoginClienteItem> lista = simpleJdbcTemplate.query(sql, mapper,nuevoLoginClienteItem.getLogin());
		return lista;
	}
	// obtiene la lista de logins
	@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
	public List<NuevoLoginClienteItem> getListaLogins() throws ParseException {
		RowMapper<NuevoLoginClienteItem> mapper = new RowMapper<NuevoLoginClienteItem>() {  
	        public NuevoLoginClienteItem mapRow(ResultSet rs, int rowNum) throws SQLException {
	        	NuevoLoginClienteItem item = new NuevoLoginClienteItem();	        	
	        	item.setLogin(rs.getString("login"));
	            return item;
	        }
	    };		
		String sql="select login from novatec.usuario";		
		List<NuevoLoginClienteItem> lista = simpleJdbcTemplate.query(sql, mapper);
		return lista;
	}

	
	// valida el campo RUC_DNI
	@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
	public List<NuevoLoginClienteItem> validarLoginRUC_DNI(NuevoLoginClienteItem nuevoLoginClienteItem) throws ParseException {
		
		RowMapper<NuevoLoginClienteItem> mapper = new RowMapper<NuevoLoginClienteItem>() {  
	        public NuevoLoginClienteItem mapRow(ResultSet rs, int rowNum) throws SQLException {
	        	NuevoLoginClienteItem item = new NuevoLoginClienteItem();	        	
	        	Long rucdni = rs.getLong("ruc_dni");
	        	item.setRucdni(rucdni);
	            return item;
	        }
	    };		
		String sql="select ruc_dni from novatec.cliente where ruc_dni=?";		
		List<NuevoLoginClienteItem> lista = simpleJdbcTemplate.query(sql, mapper,nuevoLoginClienteItem.getRucdni());
		return lista;
	}
	// obtiene la lista de RUC_DNI's
	@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
	public List<NuevoLoginClienteItem> getListaRUC_DNI() throws ParseException {
		RowMapper<NuevoLoginClienteItem> mapper = new RowMapper<NuevoLoginClienteItem>() {  
	        public NuevoLoginClienteItem mapRow(ResultSet rs, int rowNum) throws SQLException {
	        	NuevoLoginClienteItem item = new NuevoLoginClienteItem();	        	
	        	item.setRucdni(rs.getLong("ruc_dni"));
	            return item;
	        }
	    };		
		String sql="select ruc_dni from novatec.cliente";		
		List<NuevoLoginClienteItem> lista = simpleJdbcTemplate.query(sql, mapper);
		return lista;
	}
	
	
	
	
}
